//! 给你一个有序数组 nums ，请你 原地 删除重复出现的元素，使得出现次数超过两次的元素只出现两次 ，返回删除后数组的新长度。
//! 不要使用额外的数组空间，你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成

struct Solution;

impl Solution {


    /// 第一种方法，和上一题类似
    /// 前两个不用进行判断，所以直接数量从2起步，即slow=2，fast表示待判断的下标，也是从2开始
    /// 如果nums[slow-1]!=nums[fast],就表示第三个和第一个不相等，就开始交换，如果相等，fast+1开始下一个数值对比
    /// 
    pub fn remove_duplicates(nums: &mut Vec<i32>) -> i32 {
        let len = nums.len();
        if len < 3 {
            return len as i32;
        }
        
        // 定义两个指针，slow表示没有问题的长度，fast表示待判断的下标
        let mut slow = 2;
        let mut fast = 2;
        while fast < len {
            if nums[slow-2] != nums[fast] {
                nums[slow] = nums[fast];
                slow += 1;
            }
            fast += 1;
        }
        return slow as i32;
    }
}

#[cfg(test)]
mod test {

    use super::*;

    #[test]
    fn test1(){
        let mut nums = vec!(1,1,1,1,2,2,2,2,2);
        let count = Solution::remove_duplicates(&mut nums);
        println!("数组={:?}, count={}", nums , count);

        let mut nums = vec!(1, 1, 2);
        let count = Solution::remove_duplicates(&mut nums);
        println!("数组={:?}, count={}", nums , count);


        let mut nums = vec!(0,0,1,1,1,1,2,3,3);
        let count = Solution::remove_duplicates(&mut nums);
        println!("数组={:?}, count={}", nums , count);
    }
}